home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / hd_installers / -whdload- / whdload_dev / src / macros / mulu32.i next >
Text File  |  2000-02-28  |  1KB  |  82 lines

  1.  
  2.  IFND MULU32_I
  3. MULU32_I=1
  4.  
  5. ;----------------------------------------
  6. ; Multipliziert zwei 32-Bit Zahlen
  7. ;    Übergabe :    1. Quelle 1
  8. ;            2. Ergebnis H
  9. ;            3. Quelle 2 = Ergebnis L
  10.  
  11. mulu32    MACRO
  12.  
  13.  IFND CPU
  14.     FAIL    Symbol CPU must defined for macro "mulu32.i" (i.e. CPU=68020)
  15.  ENDIF
  16.  IFNE    NARG-3
  17.   IFNE    NARG-2
  18.     FAIL    bad amount of args to macro "mulu32" (i.e. "Mulu32 d1,d2,d3" or "Mulu32 d1,d2")
  19.   ENDC
  20.  ENDC
  21.         
  22.     IFPL    CPU-68020
  23.      IFEQ    NARG-2
  24.         mulu.l    \1,\2
  25.      ELSE
  26.         mulu.l    \1,\2:\3
  27.      ENDC
  28.     ELSE
  29.      IFEQ    NARG-2
  30.         ;\1 Quelle 1
  31.         ;\2 Quelle 2
  32.         ;\2 Ergebnis
  33.         move.l    \2,-(a7)
  34.         mulu    \1,\2        ;LOW1 * LOW2
  35.         move.l    \2,-(a7)
  36.         swap    \1
  37.         move.w    (6,a7),\2
  38.         mulu    \1,\2        ;HIGH1 * LOW2
  39.         add.w    \2,(a7)
  40.         swap    \1
  41.         move.w    (4,a7),\2
  42.         mulu.w    \1,\2        ;LOW1 * HIGH2
  43.         swap    \2
  44.         add.l    (a7)+,\2
  45.         addq.l    #4,a7        ;(OVERFLOW & CARRY are not set correctly !!!)
  46.      ELSE
  47.         ;\1 Quelle 1
  48.         ;\3 Quelle 2
  49.         ;\2 Ergebnis High
  50.         ;\3 Ergebnis Low
  51.         move.w    \1,\2        ;1. MULU (beide Low-Teile)
  52.         mulu.w    \3,\2
  53.         move.l    \2,-(a7)    ;-> ELH\@
  54.  
  55.         move.l    \1,\2        ;2. MULU (beide High-Teile)
  56.         swap    \2
  57.         swap    \3        ;Q2 swapped
  58.         mulu.w    \3,\2
  59.         move.l    \2,-(a7)    ;-> EHH\@
  60.  
  61.         move.w    \1,\2        ;3. MULU (Low und High-Teil)
  62.         mulu.w    \3,\2
  63.         add.l    \2,(2,a7)
  64.         bcc.b    .skip1\@
  65.         addq.w    #1,(a7)
  66. .skip1\@        
  67.         move.l    \1,\2        ;4. MULU (High und Low-Teil)
  68.         swap    \2
  69.         swap    \3
  70.         mulu.w    \3,\2
  71.         add.l    \2,(2,a7)
  72.         bcc.b    .skip2\@
  73.         addq.w    #1,(a7)
  74. .skip2\@
  75.         move.l    (a7)+,\2
  76.         move.l    (a7)+,\3
  77.      ENDC
  78.     ENDC
  79.     ENDM
  80.  ENDC
  81.  
  82.